[tutorial] Raspberry Pi – Docker, Proxy, Let’s Encrypt, SUPLA, SUPLA-Scripts...

Awatar użytkownika
milion81
Posty: 194
Rejestracja: pn maja 07, 2018 8:34 am

cino111 pisze: sob mar 09, 2019 8:07 pm A co aktualizacja daje dla RPI3?
z tego co zauważyłem to zmienił się sposób wykrywania nowych urządzeń tzn nie trzeba przeskakiwać na inną zakładkę aby wykryło, przynajmniej na moim pi zero
Ostatnio zmieniony sob mar 09, 2019 8:54 pm przez milion81, łącznie zmieniany 1 raz.
Awatar użytkownika
milion81
Posty: 194
Rejestracja: pn maja 07, 2018 8:34 am

fracz pisze: sob mar 09, 2019 7:31 pm Kliknij w tym trzecim czerwonym wpisie po prawej stronie link "commons...." - i jeszcze raz screen tego co się pokaże.

Kod: Zaznacz cały

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>SUPLA Cloud</title>
    <meta name="viewport"
            content="width=device-width, initial-scale=1">
    <meta name="theme-color"
            content="#00732C">
        <style>
        #page-preloader {
            height: 400px;
            width: 350px;
            position: absolute;
            top: 50%;
            left: 50%;
            margin-left: -175px;
            margin-top: -200px;
            text-align: center;
            font-family: 'Quicksand', sans-serif;
        }

        #page-preloader svg {
            width: 200px;
            height: 200px;
        }

        #page-preloader .if-too-long {
            display: none;
        }

        #page-preloader.too-long .if-too-long {
            display: block;
            padding-top: 70px;
        }

        #page-preloader noscript {
            color: #F60;
        }

        #page-preloader .loader-dots {
            margin: 70px auto;
        }

        #page-preloader .loader-dots div {
            margin-top: 0;
        }

    </style>
    <style>
        .loader-dots {
            font-size: 0;
            display: block;
            position: relative;
            width: 120px;
            margin: 100px auto;
        }

        .loader-dots div {
            background: none;
            border: solid 2px black;
            width: 25px;
            height: 25px;
            border-radius: 30px;
            position: absolute;
            animation: dots-bounce 1.75s infinite;
            top: 50%;
            margin-top: -15px;
        }

        .loader-dots div:nth-child(2) {
            animation-delay: 0.25s;
            left: 50%;
            margin-left: -15px;
        }

        .loader-dots div:nth-child(3) {
            animation-delay: 0.5s;
            right: 0;
        }


        @keyframes dots-bounce {
            10% {
                transform: translate3d(0, 30px, 0);
                animation-timing-function: cubic-bezier(0.5, 0, 0.5, 1);
                height: 30px;
            }
            14% {
                height: 90px;
            }
            15% {
                height: 30px;
                transform: translate3d(0, -60px, 0);
                animation-timing-function: cubic-bezier(0.8, 0, 0.8, 1);
            }
            35% {
                transform: translate3d(0, 0, 0);
            }
        }

        .black .loader-dots div {
            border-color: white;
        }
    </style>
    <link rel="icon"
            href="/assets/img/icons/favicon.ico"
            type="image/x-icon"/>
    <link rel="shortcut icon"
            href="/assets/img/icons/favicon.ico"
            type="image/x-icon"/>
            <link rel="icon"
                type="image/png"
                href="/assets/img/icons/supla16.png"
                sizes="16x16">
            <link rel="icon"
                type="image/png"
                href="/assets/img/icons/supla32.png"
                sizes="32x32">
            <link rel="icon"
                type="image/png"
                href="/assets/img/icons/supla96.png"
                sizes="96x96">
            <link rel="icon"
                type="image/png"
                href="/assets/img/icons/supla160.png"
                sizes="160x160">
            <link rel="icon"
                type="image/png"
                href="/assets/img/icons/supla196.png"
                sizes="196x196">
                <link rel="apple-touch-icon"
                sizes="57x57"
                href="/assets/img/icons/supla57.png">
            <link rel="apple-touch-icon"
                sizes="60x60"
                href="/assets/img/icons/supla60.png">
            <link rel="apple-touch-icon"
                sizes="72x72"
                href="/assets/img/icons/supla72.png">
            <link rel="apple-touch-icon"
                sizes="76x76"
                href="/assets/img/icons/supla76.png">
            <link rel="apple-touch-icon"
                sizes="114x114"
                href="/assets/img/icons/supla114.png">
            <link rel="apple-touch-icon"
                sizes="120x120"
                href="/assets/img/icons/supla120.png">
            <link rel="apple-touch-icon"
                sizes="144x144"
                href="/assets/img/icons/supla144.png">
            <link rel="apple-touch-icon"
                sizes="152x152"
                href="/assets/img/icons/supla152.png">
        <base href="/">
</head>
<body>
        <div class="vue-container invisible">
            <transition name="fade">
        <navbar v-if="$user.username"></navbar>
    </transition>
    <loading-cover :loading="changingRoute">
        <transition name="fade-router">
            <router-view></router-view>
        </transition>
    </loading-cover>
    <cookie-warning v-if="$frontendConfig.requireCookiePolicyAcceptance && $user.username && !$user.userData.agreements.cookies"></cookie-warning>
            <idle-logout v-if="$user.username"></idle-logout>
        </div>
    <div id="page-preloader">
        <svg version="1.1"
        id="Layer_1"
        xmlns="http://www.w3.org/2000/svg"
        x="0px"
        y="0px"

        viewBox="-1 0.2 56.5 59.8"
        style="enable-background:new -1 0.2 56.5 59.8;"
        xml:space="preserve">

    <style type="text/css">
        .st0 {
            display: none;
        }

        .st1 {
            fill: none;
        }
    </style>

    <g id="Layer_1_1_"
            class="st0"></g>

    <g>
        <path class="st1"
                d="M27.8,57.7c-9.2,0-18.3,0-27.5,0c-0.2,0-0.3,0-0.3-0.3c0-18.3,0-36.7,0-55c0-0.2,0-0.3,0.3-0.3
	c18.3,0,36.7,0,55,0c0.2,0,0.3,0,0.3,0.3c0,18.3,0,36.7,0,55c0,0.2,0,0.3-0.3,0.3C46.1,57.7,36.9,57.7,27.8,57.7z M16.8,3
	c-0.3,0-0.6,0-0.9,0c-0.2,0-0.4,0-0.6,0.1c-3,0.4-5.6,1.7-7.6,4.1c-2.1,2.5-2.9,5.3-2.5,8.6c0.3,2.8,1.6,5.1,3.7,7
	c2.5,2.2,5.4,3.1,8.7,2.9c0.2,0,0.3,0.1,0.4,0.3c1.7,4.9,3.4,9.8,5,14.7c0.6,1.7,1.2,3.4,1.7,5.2c0.1,0.3,0,0.4-0.2,0.6
	c-2.1,1.4-3,4-2.3,6.3c1.2,3.9,6,5.3,9.2,2.9c1.7-1.3,2.5-3,2.3-5.2c-0.1-1.3-0.7-2.5-1.6-3.4c-0.2-0.2-0.2-0.3,0-0.4
	c0.5-0.5,1-1,1.4-1.5c1.4-1.5,2.8-3,4.2-4.5c1.3-1.4,2.6-2.7,3.8-4.1c0.1-0.1,0.2-0.2,0.4-0.1c2.2,1.2,4.5,1.2,6.7-0.1
	c2.4-1.3,3.6-4.1,3.1-6.7c-0.6-3.1-3.3-5.3-6.7-5.3c-1.5,0-2.9,0.5-4.1,1.5c-0.2,0.2-0.4,0.2-0.7,0c-0.8-0.5-1.5-1-2.3-1.5
	c-3.4-2.1-6.7-4.3-10.1-6.4c-0.2-0.1-0.2-0.2-0.1-0.4c0.3-1,0.5-1.9,0.5-2.9c0.1-1.8-0.3-3.5-1.1-5.1C25.2,5.2,21.5,3.2,16.8,3z"/>

        <path class="this"
                d="M16.8,3c4.8,0.2,8.4,2.2,10.6,6.5c0.8,1.6,1.1,3.3,1.1,5.1c0,1-0.2,2-0.5,2.9c-0.1,0.2,0,0.3,0.1,0.4
	c3.4,2.1,6.7,4.3,10.1,6.4c0.8,0.5,1.5,1,2.3,1.5c0.3,0.2,0.4,0.2,0.7,0c1.2-1,2.6-1.5,4.1-1.5c3.3,0,6.1,2.2,6.7,5.3
	c0.5,2.6-0.8,5.3-3.1,6.7c-2.2,1.2-4.5,1.2-6.7,0.1c-0.2-0.1-0.3-0.1-0.4,0.1c-1.3,1.4-2.6,2.7-3.8,4.1c-1.4,1.5-2.8,3-4.2,4.5
	c-0.5,0.5-0.9,1-1.4,1.5c-0.2,0.2-0.2,0.3,0,0.4c0.9,0.9,1.5,2.1,1.6,3.4c0.2,2.1-0.6,3.9-2.3,5.2c-3.2,2.4-8,1-9.2-2.9
	c-0.8-2.3,0.2-4.9,2.3-6.3c0.2-0.2,0.3-0.3,0.2-0.6c-0.5-1.7-1.2-3.4-1.7-5.2c-1.7-4.9-3.4-9.8-5-14.7c-0.1-0.2-0.1-0.3-0.4-0.3
	c-3.3,0.2-6.2-0.7-8.7-2.9c-2.1-1.8-3.4-4.2-3.7-7c-0.4-3.2,0.5-6.1,2.5-8.6c2-2.3,4.5-3.7,7.6-4.1c0.2,0,0.4,0,0.6-0.1
	C16.2,3,16.5,3,16.8,3z M21.3,24.9c0,0,0,0.1,0,0.2c0.4,1.8,0.8,3.5,1.3,5.3c1.2,4.9,2.4,9.9,3.5,14.8c0.1,0.3,0.2,0.3,0.4,0.3
	c1.4-0.3,2.8-0.2,4.1,0.5c0.2,0.1,0.3,0.1,0.5-0.1c3-3.6,5.9-7.1,8.8-10.8c0.1-0.2,0.1-0.3,0-0.5c-1.5-2.2-1.6-4.5-0.3-6.8
	c0.1-0.2,0.1-0.3-0.1-0.4c-2.4-1.3-4.8-2.6-7.2-3.9c-1.8-1-3.6-1.9-5.4-2.9c-0.2-0.1-0.3-0.1-0.4,0.1c-0.3,0.5-0.7,1-1.1,1.4
	c-1.1,1.2-2.4,2.1-3.9,2.7C21.4,24.7,21.3,24.7,21.3,24.9z M24.6,14.2c0-0.7-0.1-1.5-0.4-2.3C23,8.8,20.7,7,17.4,6.7
	c-2.6-0.2-4.9,0.7-6.7,2.7c-2.2,2.5-2.5,6.2-0.6,9c1.8,2.7,5,4,8.3,3.3C22,21,24.6,17.9,24.6,14.2z M28.1,54.8c0.2,0,0.4,0,0.6-0.1
	c2.5-0.4,4-3,3.1-5.3c-0.7-1.6-2.5-2.7-4.4-2.4c-2.2,0.3-3.7,2.5-3.3,4.6C24.4,53.5,26,54.8,28.1,54.8z M45.4,27
	c-0.3,0-0.6,0-0.8,0.1c-2.4,0.5-3.8,2.9-2.9,5.2c0.8,1.9,3,2.9,5,2.2c1.9-0.6,2.9-2.5,2.5-4.4C48.9,28.2,47.3,27,45.4,27z"/>

        <path class="st1"
                d="M21.3,24.9c0-0.2,0.1-0.2,0.2-0.2c1.5-0.6,2.8-1.5,3.9-2.7c0.4-0.4,0.8-0.9,1.1-1.4c0.1-0.2,0.2-0.2,0.4-0.1
	c1.8,1,3.6,1.9,5.4,2.9c2.4,1.3,4.8,2.6,7.2,3.9c0.2,0.1,0.3,0.2,0.1,0.4c-1.3,2.3-1.1,4.6,0.3,6.8c0.1,0.2,0.1,0.3,0,0.5
	c-2.9,3.6-5.9,7.2-8.8,10.8c-0.1,0.2-0.3,0.2-0.5,0.1c-1.3-0.7-2.7-0.8-4.1-0.5c-0.3,0.1-0.4,0-0.4-0.3c-1.2-4.9-2.3-9.9-3.5-14.8
	c-0.4-1.8-0.8-3.5-1.3-5.3C21.3,25,21.3,24.9,21.3,24.9z"/>

        <path class="st1"
                d="M24.6,14.2c0,3.7-2.6,6.8-6.2,7.6c-3.3,0.7-6.5-0.6-8.3-3.3c-1.9-2.8-1.6-6.5,0.6-9c1.8-2,4-2.9,6.7-2.7
	c3.3,0.3,5.6,2,6.8,5.2C24.5,12.7,24.6,13.5,24.6,14.2z"/>

        <path class="st1"
                d="M28.1,54.8c-2,0-3.7-1.3-4-3.2c-0.4-2.1,1.1-4.3,3.3-4.6c1.9-0.3,3.7,0.8,4.4,2.4c1,2.3-0.5,5-3.1,5.3
	C28.5,54.8,28.2,54.8,28.1,54.8z"/>

        <path class="st1"
                d="M45.4,27c1.9,0,3.5,1.3,3.9,3c0.4,1.9-0.7,3.8-2.5,4.4c-2,0.7-4.3-0.3-5-2.2c-0.9-2.2,0.5-4.7,2.9-5.2
	C44.8,27,45.1,27,45.4,27z"/>
    </g>
</svg>
        <div class="loader-dots">
            <div></div>
            <div></div>
            <div></div>
        </div>
        <noscript>
            <h3>SUPLA-Cloud will not work without Javascript</h3>
        </noscript>
        <p class="if-too-long text-muted">
            if it takes too long, check if the JS scripts are loaded correctly
        </p>
    </div>
    <script>
        setTimeout(function () {
            var preloader = document.getElementById('page-preloader');
            if (preloader) {
                preloader.className = 'too-long';
            }
        }, 8000);
    </script>
    <script>
    window.FRONTEND_CONFIG = {"regulationsAcceptRequired":false,"requireCookiePolicyAcceptance":false,"recaptchaEnabled":false,"recaptchaSiteKey":null,"actAsBrokerCloud":false,"suplaUrl":"https:\/\/XXXXXX.XXXXXX.com","max_upload_size":{"file":2097152,"total":8388608}};
    window.FRONTEND_CONFIG['serverTime'] = '2019-03-09T20:49:34+00:00';
    window.FRONTEND_CONFIG['renderStart'] = new Date();
    window.FRONTEND_CONFIG['baseUrl'] = '';
</script>
    <script src="/assets/dist/commons.47b1cb8ca78552e247e4.js"></script>
</body>
</html>
Załączniki
3.png
3.png (82.91 KiB) Przejrzano 3477 razy
4.png
4.png (169.47 KiB) Przejrzano 3477 razy
Awatar użytkownika
makrz
Posty: 395
Rejestracja: wt lis 27, 2018 1:43 pm
Lokalizacja: Opole

Witam

Próbuję zaktualizować supla scripts z wersji 3.0.0 na Pi3b i dostaję coś takiego i nie wiem co z tym zrobić. Proszę o pomoc.

Kod: Zaznacz cały

pi@raspberrypi:~/supla-scripts $  git pull
Updating f36bf9b..a03d639
error: Your local changes to the following files would be overwritten by merge:
        backend/app/Application.php
        backend/app/UserAndUrlAwareLogger.php
        backend/app/authorization/JwtAndBasicAuthorizationMiddleware.php
        backend/app/commands/DispatchCyclicTasksCommand.php
        backend/app/commands/DispatchThermostatCommand.php
        backend/app/commands/DispatchTimeScenesExecutionCommand.php
        backend/app/commands/SendMetricsGaugesCommand.php
        backend/app/commands/SuplaScriptsManager.php
        backend/composer.json
        backend/composer.lock
        backend/controllers/ChannelsController.php
        backend/controllers/ClientsController.php
        backend/controllers/NotificationsController.php
        backend/controllers/ScenesController.php
        backend/controllers/SystemController.php
        backend/controllers/TokensController.php
        backend/index.php
        backend/models/Client.php
        backend/models/JwtToken.php
        backend/models/User.php
        backend/models/encoders/ColumnEncryptor.php
        backend/models/notification/Notification.php
        backend/models/scene/FeedbackInterpolator.php
        backend/models/scene/PendingScene.php
        backend/models/scene/Scene.php
        backend/models/scene/SceneExecutor.php
        backend/models/supla/SuplaApiReal.php
        backend/models/thermostat/Thermostat.php
        docker/Dockerfile
        docker/utils/crontab
        frontend/app/app.coffee
        frontend/app/app.scss
        frontend/app/clients/clients-list.coffee
        frontend/app/clients/clients-list.html
        frontend/app/common/authentication/token.coffee
        frontend/app/common/http-error-handler.coffee
        frontend/app/dashboard/channel/channel-actions.html
        frontend/app/index.html
        frontend/app/notifications/form/notification-form.html
        frontend/app/routes.coffee
        frontend/app/scenes/details/scene-details-page.html
        frontend/app/scenes/feedback/feedback-field.coffee
        frontend/app/scenes/feedback/feedback-interpolation.coffee
        frontend/app/scenes/feedback/feedback-interpolation.html
        frontend/app/scenes/form/scene-form.html
        frontend/app/scenes/selector/scene-caption.coffee
        frontend/app/scenes/selector/scene-selector.coffee
        frontend/app/scenes/selector/scene-selector.html
        frontend/app/thermostat/thermostats-list.html
        frontend/app/user/account-page.html
        frontend/app/user/details/account-details.html
        frontend/app/user/login-form/login-form.html
        frontend/app/user/login-form/login-view.coffee
        frontend/app/user/login-form/login-view.html
        frontend/app/user/login-form/login-view.scss
        frontend/package-lock.json
        frontend/package.json
        package-lock.json
        package.json
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        backend/app/authorization/IpRequestQuotaMiddleware.php
        backend/app/authorization/JwtWithBodyAuthentication.php
        backend/app/commands/ClearClientRegistrationCodesCommand.php
        backend/app/commands/ClearRequestQuotaLogsCommand.php
        backend/app/commands/OauthRefreshTokensCommand.php
        backend/database/migrations/20181204225138_user_short_unique_id.php
        backend/database/migrations/20181216004345_scene_condition.php
        backend/database/migrations/20181216202223_scene_stack_in_pending_scene.php
        backend/database/migrations/20181217165643_request_quota.php
        backend/database/migrations/20190102075824_thermostat_failure_count.php
        backend/database/migrations/20190103000234_user_token_expiration_time.php
        backend/database/migrations/20190118203838_add_client_purpose.php
        backend/database/migrations/20190122084752_add_client_registration_code.php
        backend/models/BelongsToUser.php
        backend/models/scene/FeedbackTwigExtension.php
        backend/models/supla/OAuthClient.php
        backend/models/supla/SuplaApiClientWithOAuthSupport.php
        frontend/app/scenes/dropdown/scenes-dropdown.coffee
        frontend/app/scenes/dropdown/scenes-dropdown.html
        frontend/app/user/automate/user-automate-settings.coffee
        frontend/app/user/automate/user-automate-settings.html
        frontend/app/user/automate/user-automate-settings.scss
        frontend/app/user/login-form/login-with-supla.coffee
        frontend/app/user/login-form/login-with-supla.html
        frontend/app/user/login-form/login-with-token.coffee
        frontend/app/user/login-form/login-with-token.html
        frontend/app/user/oauth/authorize-page.coffee
        frontend/app/user/oauth/authorize-page.html
Please move or remove them before you merge.
Aborting
pi@raspberrypi:~/supla-scripts $
Awatar użytkownika
lesny8
Posty: 2802
Rejestracja: pn gru 11, 2017 9:43 pm

makrz pisze: ndz mar 10, 2019 9:45 am Witam

Próbuję zaktualizować supla scripts z wersji 3.0.0 na Pi3b i dostaję coś takiego i nie wiem co z tym zrobić. Proszę o pomoc.
Masz lokalnie nie zatwierdzone zmiany w tych plikach, które git Ci podaje,
Jeśli nie zmieniałeś nic to porzuć powstałe zmiany

Kod: Zaznacz cały

git fetch origin
Jak nie pomorze to

Kod: Zaznacz cały

git reset --hard origin/master
i dopiero

Kod: Zaznacz cały

git pull
Czekam na kolejne Supla Offline Party 👍
Awatar użytkownika
makrz
Posty: 395
Rejestracja: wt lis 27, 2018 1:43 pm
Lokalizacja: Opole

lesny8 pisze: ndz mar 10, 2019 10:34 am
makrz pisze: ndz mar 10, 2019 9:45 am Witam

Próbuję zaktualizować supla scripts z wersji 3.0.0 na Pi3b i dostaję coś takiego i nie wiem co z tym zrobić. Proszę o pomoc.
Masz lokalnie nie zatwierdzone zmiany w tych plikach, które git Ci podaje,
Jeśli nie zmieniałeś nic to porzuć powstałe zmiany

Kod: Zaznacz cały

git fetch origin
Jak nie pomorze to

Kod: Zaznacz cały

git reset --hard origin/master
i dopiero

Kod: Zaznacz cały

git pull
Dziękuję bardzo.
Oczywiście pomogło. :D
Awatar użytkownika
lesny8
Posty: 2802
Rejestracja: pn gru 11, 2017 9:43 pm

fracz pisze: sob mar 09, 2019 6:52 pm Wydam pi3 dziś. Niestety jest to proces półautomatyczny :(
Widziałem na githubie, że trochę ten proces usprawniłeś ;) Extra
Czekam na kolejne Supla Offline Party 👍
vicam
Posty: 8
Rejestracja: czw lut 21, 2019 3:22 pm

Hej
Jak do tej pory udało mi się wszystko uruchomić ale podczas testów pojawił się mały problem w momencie zaniku internetu.
Mam router MikroTik i on odpowiada za dostęp do internetu (jest to okno na świat). Kiedy mam dostęp do internetu wszystko działa idealnie po WAN i LAN. W momencie kiedy znika internet tracę dostęp po WAN (co jest logiczne) oraz po LAN (pewnie dlatego ze nie mam dostępu do DNS-a który zamienił by nazwę domeny na moje ip.). Moje pytanie jest następujące czy jest możliwa taka konfiguracja MT ze kiedy niema internetu to i tak będę w stanie połączyć się z Supla zainstalowaną na RPI w mojej sieci po domenie np. supla.mojadomena.pl
Awatar użytkownika
pzygmunt
Posty: 18207
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Postaw lokalnego DNS-a albo wpisz zewnętrzny adres IP.
vicam
Posty: 8
Rejestracja: czw lut 21, 2019 3:22 pm

pzygmunt pisze: wt mar 12, 2019 9:45 am Postaw lokalnego DNS-a albo wpisz zewnętrzny adres IP.
Na RPI mam SUPLE i SUPLA Scripts oraz proxy więc nie mogę wpisywać adresu IP tylko domene. Nie chce tez edytować pliku HOST w windowsie. Chciał bym to załatwić na MT w ostateczności moge faktycznie postawic DNS-a na RPI
Awatar użytkownika
lesny8
Posty: 2802
Rejestracja: pn gru 11, 2017 9:43 pm

vicam pisze: wt mar 12, 2019 9:42 am Hej
Jak do tej pory udało mi się wszystko uruchomić ale podczas testów pojawił się mały problem w momencie zaniku internetu.
Mam router MikroTik i on odpowiada za dostęp do internetu (jest to okno na świat). Kiedy mam dostęp do internetu wszystko działa idealnie po WAN i LAN. W momencie kiedy znika internet tracę dostęp po WAN (co jest logiczne) oraz po LAN (pewnie dlatego ze nie mam dostępu do DNS-a który zamienił by nazwę domeny na moje ip.). Moje pytanie jest następujące czy jest możliwa taka konfiguracja MT ze kiedy niema internetu to i tak będę w stanie połączyć się z Supla zainstalowaną na RPI w mojej sieci po domenie np. supla.mojadomena.pl
Podałem Ci już rozwiązanie, które działa. Nie wiem co na te chwilę masz w firewallu, więc przeklejka wprost Ci nie zadziała.
Rozwiązaniem jest forward 4 portów, maskarada NATu i dwa wpisy Hairpin NAT. Dodam, że kolejność reguł jest ważna.
Czekam na kolejne Supla Offline Party 👍
ODPOWIEDZ

Wróć do „FAQ / Jak to zrobić”