Voice Control the £20 way

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts
  • cliffwright
    Automated Home Guru
    • Mar 2007
    • 117

    #31
    Originally posted by chris_j_hunter View Post
    shortcuts - now we know how to do them, and can think of many many we might implement, maybe the trick is just to keep an eye, and implement just the few that will help most often ...

    Yes - I think the key to effective usage really is to keep the number of shortcuts to a minimum for the things you need to be most accessible if you're physically pushing the button. If you end up with hundreds of shortcuts sprawled in a UI, you'll likely spend more time searching for the button than is tolerable. Of course, if you're going to use your voice, then you can simply keep all the shortcuts hidden away in the shortcuts app and talk to Siri.


    Originally posted by chris_j_hunter View Post
    those created on my 'phone, have been transferred also onto my wife's 'phone, without me asking ... not complaining, but how does that happen ?
    Unless both phones are signed in using the same iCloud account, or you've got some kind of Family Sharing setting in play, I'm not sure either: usually you'd need to manually share them. Are they both on separate iCloud accounts?


    Originally posted by chris_j_hunter View Post
    Cortex update - have now updated, and no change ... ie: GET & POST work via Postman, only GET works via Applescript ... logic implies problem lies in Applescript ...
    Yes, my view is that your issue isn't with Cortex - this inbound route works and is proven by your iOS Shortcuts working, so the issue has to be in the forming of the request in your Applescript. Whack some tracing between the Applescript and Cortex to check where it's going wrong.
    www.clifford-wright.co.uk/blog

    Comment

    • chris_j_hunter
      Automated Home Legend
      • Dec 2007
      • 1713

      #32
      the requests in Postman, look like this:

      curl --location --request GET 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213' --header 'Authorization: Basic nnnnnnnnnnnnnnn'

      curl --location --request POST 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213?6=1' --header 'Authorization: Basic nnnnnnnnnnnnnnn'

      and both work ...

      and in Applescript, they look like this :

      do shell script "curl --location --request GET 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213' --header 'Authorization: Basic nnnnnnnnnnnnnnn'"

      do shell script "curl --location --request POST 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213?6=1' --header 'Authorization: Basic nnnnnnnnnnnnnnn'"

      and only the GET works ...

      enclosing a string in single quotes - 'abcdef&/whatever' - is a way of ensuring it's passed-on verbatum, without triggering any response from the application that's handling it / sending it on ...

      but there seems to be a bug in Applescript ...

      Googling a lot, brings up comments pointing to it mishandling things within single quotes within double quotes - as in "abcd 'nhygf' ajyhe" ...

      and comments that say we should use quoted form of in strings containing spaces & other special characters (like & and ?) ...

      eg: quoted form of (gjsfhjfsafjsdfagh?&jsj) ...

      there's also mention of escaping - as in using the \ character to avoid misinterpretation of strings ... as in \" and \\ ...

      some of these comments go back almost twenty years ...

      I found no examples to illustrate any of their use in our situation, but have experimented with what I could imagine ... without success ... my understanding of all this is very limited, though ...

      bottom - line ... Applescript's problem seems to be with the ? character in the POST request, even though it's contained within a string that is enclosed within single quotes ...

      so ...question is - is there an alternative to it, within the ultimate destination - within the Cortex API ... ???


      PS: did have a look at using Wireshark & Fiddler - but we're running OSX 10.11.6, with which they say they are not compatible ...

      references :



      Here’s my script: set trackNum to set fedexURL to "http://www.fedex.com/Tracking?language=english&cntry_code=us&tracknumbers=" set whoSigned to do shell script "curl -A \"Mozilla/4.0\" -s " & fedexURL & trackNum (*& " | awk '/Signed for by / {print $4}' | cut -f 1 -d '


      Applescript does not seem to properly escape strings. What am I doing wrong? Example: set abc to "funky-!@#'#\"chars" display dialog abc display dialog quoted form of abc Expected / Desired Outp...
      Last edited by chris_j_hunter; 12 December 2020, 01:43 PM.
      Our self-build - going further with HA...

      Comment

      • cliffwright
        Automated Home Guru
        • Mar 2007
        • 117

        #33
        I've never used curl before and from 5 minutes of trying powershell and googling, I'm damned if I can get it to work with any header values ... however, if the "?" is your issue, can you encode this value? for example, instead of using 2213?6=1 .. maybe try 2213%F7%3D1 (%F7 being ?, and %3D being =) so that your full curl would be;

        curl --location --request POST 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213%F7%3D1' --header 'Authorization: Basic nnnnnnnnnnnnnnn'

        ?

        Cliff
        www.clifford-wright.co.uk/blog

        Comment

        • chris_j_hunter
          Automated Home Legend
          • Dec 2007
          • 1713

          #34
          thanks again ...

          yes, the cURL write-ups & discussions are not that clear - at least to me, who knows so little ...

          so ... tried them (%F7 and then %3F for ?, and %3D for =) and stiil have the problem - ie: the POST request via Applescript runs & runs without effect or response ...

          to explore further, I added the ?6=1 string to the GET request - and got the response from Cortex that the POST command should be used ...

          true, of course ... but also confirming that Cortex understood the ?6=1 addition ... ditto when I added %3F5%3D1 instead ...

          I also copied the request into Terminal, and sent it from there - worked fine, the light switched off - after I closed Terminal, not before ...

          not sure why I had to close Terminal first - but, anyway, seems to reaffirm the problem is with Applescript (rather than Shell) ...

          so - the POST works from Postman, works from Terminal, but not from Applescript ...

          while the GET request works from all three ...

          the POST instruction was created by editing a copy of the GET instruction - to insure against typo's - ie: POST in place of GET, and ?6=1 added after 2213 ...

          mysteries ! ... and grrrh !
          Last edited by chris_j_hunter; 15 December 2020, 11:12 PM.
          Our self-build - going further with HA...

          Comment

          • cliffwright
            Automated Home Guru
            • Mar 2007
            • 117

            #35
            Hmm .. this sort of thing bugs me .. over Xmas where I've got some more time, I'll have a little play with a few things, but not having a Mac I can't really help on the Applescript front.


            On a segway'd subject ... have you ever used the Virtual API object variables in Cortex? This is something I'm struggling to understand too at the minute. I've got 2 things I'm trying to achieve.

            1 - I can successfully fire a POST request into Cortex and get one of the variables to have a Current Value (either True, false, or a value 0-100) but, other than that, I'm struggling to actually use that value anywhere. Do you know how to then reference the variable "Current value" in any logic anywhere (whether that's part of a Macro, or I can trigger an object state based on the variable value)? For example, the Home Assistant mobile app seems pretty reliable at reporting its GPS location in quick time, so I can setup an additional presence indicator to know when "I" (personally) am home, vs anyone else being at home. If Cortex know it's "me", then it can personalise certain things how "I" like them vs how the wife likes them. (I'm considering whether I can also use this in future use-cases for things like automatically disarming alarms, potentially even unlocking certain entry points etc kinda like Keyless entry on a car).

            So I've got it setup that the HA iOS app tells my HA Install that I'm home (I've tested it's reaction times, and it seems reliable so far after a couple of weeks of testing it), and then I can (need to figure out the exact way, but know it's do-able) get that to fire an API request into Cortex to pass on the message.

            I just don't know how to then use this ..


            2 - Kinda similar, but opposite ... I want Cortex to fire a Get Request, parse the response .. and use the value returned in some logical way. For example, to help bake in reliability if I'm using some Wifi Zigbee devices controlled via rest API into HA ... I want to (maybe just at the end of the day) poll their current state using a GET request into HA .. which returns "state=on" ... then have Cortex take that "on" value and align the associated Cortex light object to that state. This'd cover off anyone manually fiddling with the switch locally and so Cortex getting out of sync. (I'll likely have other use-cases, but this is simple one to follow)

            In this one, I appear to be able to follow the Cortex help file and get the "on" value returned to show up in a Noticeboard, but I just don't see how to use it in any logic .. how do I output it "somewhere" and then use it in a comparison with (for example) a current cortex light state?
            www.clifford-wright.co.uk/blog

            Comment

            • chris_j_hunter
              Automated Home Legend
              • Dec 2007
              • 1713

              #36
              Cliff -

              interesting - hadn't noticed the Virtual API logic object class (?) before ...

              so, having created one in our DataBase, and (via its Behaviours window) an ON/Off (Boolean) variable within it, I did a GET....Objects on Cortex, to get a complete listing of objects, and it was not among them ...

              tried again, same result - then realised I'd not Web Enabled it !

              then, in Structure list, I double-clicked on the Virtual API, got the drop-down menu, and clicked on Connections (*) ...

              the Connections window then appeared, there were several to choose from ...

              so connected a free DRB button to Toggle input & a Light to the output, and tried it out - worked fine !

              Chris

              (*) I'm working through TeamViewer, and had to go that way - IIRC, on the Cortex PC itself, right clicking the Virtual API icon in PlanView with the mouse would have done the same ...
              Last edited by chris_j_hunter; 16 December 2020, 06:16 PM.
              Our self-build - going further with HA...

              Comment

              • chris_j_hunter
                Automated Home Legend
                • Dec 2007
                • 1713

                #37
                1- knowing it's you ... strange to say, that's exactly what we're trying to do with our RFID tags through Applescript !

                eg: when someone gets home, they wave their key-fob over the Mir:ror, and Cortex knows who's home ...

                eg: place a Nano:ztag (RFID enabled object) on the Mir:ror, and the kitchen operates one way, place another & it operates another way ...

                a Mir:ror signals to Cortex when an object is placed on it, and again when it's removed ...

                lots of possibilities, because we have nine Nano:ztags, and seventy-two Ztamp:s (small RFID sticker tiles that can be attached to key-fobs, books, mugs, anything) ... and four Mir:rors (though haven't yet tried connecting more than one to our AppleMac') ... plus a Nabaztag:tag, which can be waved at and can also speak ...

                another idea is to use some as a key - wave RFIDs in a particular sequence to unlock something ...

                Chris
                Last edited by chris_j_hunter; 16 December 2020, 07:51 PM.
                Our self-build - going further with HA...

                Comment

                • cliffwright
                  Automated Home Guru
                  • Mar 2007
                  • 117

                  #38
                  Originally posted by chris_j_hunter View Post
                  Cliff -

                  interesting - hadn't noticed the Virtual API logic object class (?) before ...

                  so, having created one in our DataBase, and (via its Behaviours window) an ON/Off (Boolean) variable within it, I did a GET....Objects on Cortex, to get a complete listing of objects, and it was not among them ...

                  tried again, same result - then realised I'd not Web Enabled it !

                  then, in Structure list, I double-clicked on the Virtual API, got the drop-down menu, and clicked on Connections (*) ...

                  the Connections window then appeared, there were several to choose from ...

                  so connected a free DRB button to Toggle input & a Light to the output, and tried it out - worked fine !

                  Chris

                  (*) I'm working through TeamViewer, and had to go that way - IIRC, on the Cortex PC itself, right clicking the Virtual API icon in PlanView with the mouse would have done the same ...

                  OK - so you've got a Virtual API object to now have an On/Off Boolean state based on an input (in our case the DRB button) ... but my question is then, how do you (we) use that Boolean state to drive logic? How are you referencing this to do logic, for example a simple example such as;

                  If BooleanState = On
                  Then set kitchen lights to 50% bright
                  Else set kitchen light to 90%
                  End if

                  ?

                  This is the bit I'm struggling with (I must be missing something obvious I'm sure!)
                  www.clifford-wright.co.uk/blog

                  Comment

                  • chris_j_hunter
                    Automated Home Legend
                    • Dec 2007
                    • 1713

                    #39
                    short answer is via the Virtual API's Connections window ... the last entry of which is the output I connected to a Light ...

                    have checked, and the list of possible connections includes Lights & Pumps & General Logic Gates & ... all the usual things ...


                    PS: have set up your example here, too, and it works ...

                    DRB button => Virtual API / Variable 0 (input Toggle)

                    Virtual API / Variable 0 (output) => Gate 1 (Source A) of General Logic object (NOT) => SLD dimmer Scene 1 (To True)
                    Virtual API / Variable 0 (output) => Gate 2 (Source A) of General Logic object (OR)...=> SLD dimmer Scene 4 (To True)


                    PPS: if you've not used General Logic before - it's up the list from the Virtual API, and you create gates within one by clicking Add, after which it gives you a choice of various digital & analogue types ...
                    Last edited by chris_j_hunter; 17 December 2020, 02:30 PM.
                    Our self-build - going further with HA...

                    Comment

                    • cliffwright
                      Automated Home Guru
                      • Mar 2007
                      • 117

                      #40
                      Originally posted by chris_j_hunter View Post
                      short answer is via the Virtual API's Connections window ... the last entry of which is the output I connected to a Light ...

                      have checked, and the list of possible connections includes Lights & Pumps & General Logic Gates & ... all the usual things ...


                      PS: have set up your example here, too, and it works ...

                      DRB button => Virtual API / Variable 0 (input Toggle)

                      Virtual API / Variable 0 (output) => Gate 1 (Source A) of General Logic object (NOT) => SLD dimmer Scene 1 (To True)
                      Virtual API / Variable 0 (output) => Gate 2 (Source A) of General Logic object (OR)...=> SLD dimmer Scene 4 (To True)


                      PPS: if you've not used General Logic before - it's up the list from the Virtual API, and you create gates within one by clicking Add, after which it gives you a choice of various digital & analogue types ...

                      Sorry if I'm being a little dense here (I will have a think about this tonight when my brain is less work focussed) .. but in this example, this is basically creating the functionality of;

                      IF - "A Value" is 1, then set a scene to 1
                      End If.

                      No?

                      "A Value" in this case, is a GL Object output.

                      .. but to get to "A value", we're going through a series of batten passed of data by firing an API to pass the value (True) into a Virtual API object, and then passing this through the GL object to evaluate "= 1" ...

                      So the steps are ..

                      1) Fire an API to set a value into the Virtual API object
                      2) Pass Virtual API Object value into GL
                      3) GL evaluate the logical output (1)
                      4) Set a specific scene

                      Isn't this just a more complex way of either in Step 1, firing the API that sets the SLD Scene direct, or (if you perhaps had multiple outputs so want to facilitate 1 input to several outputs) having the Virtual API object "out" connection set the SLD Scene to 1 direct?

                      Likewise, in my scenario of this virtual API object being True/False based on whether the HA app says I'm physically home or not, the above wouldn't then revert when one of us leaves the house right? (ie the Virtual API Object goes to False).

                      Maybe I just need to think about it a bit more ..
                      www.clifford-wright.co.uk/blog

                      Comment

                      • chris_j_hunter
                        Automated Home Legend
                        • Dec 2007
                        • 1713

                        #41
                        have now tried it here direct - Virtual API / Variable 0 toggled by a DRB button & connected direct to the Light ...

                        doesn't work ... do need to go through the GL object ... with the output set to To True ... which maybe is a clue as to why ... though it may also be that Scenes don't toggle (as it were) ... and that Scenes set levels, not on or off ...

                        having the GL object might be advantageous, too, because can incorporate other interlocks, for more context-sensitivity ...

                        ===

                        btw ... just half an hour ago, I solved (thanks to an after-thought suggestion from my nephew) the POST problem ... the trick is to include - only for the Applescript / Shell situation (not Postman or Terminal, etc) a null data element ... ie: the problem was that the cURL was waiting on data that never arrived ...

                        ie: include -d'' (the '' being two single quotes) as follows :

                        do shell script "curl --location --request GET 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213' --header 'Authorization: Basic nnnnnnnnnnnnnnn'"

                        do shell script "curl --location --request POST 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213?6=1' -d'' --header 'Authorization: Basic nnnnnnnnnnnnnnn'"

                        simple, when you know !!
                        Last edited by chris_j_hunter; 17 December 2020, 06:47 PM.
                        Our self-build - going further with HA...

                        Comment

                        • cliffwright
                          Automated Home Guru
                          • Mar 2007
                          • 117

                          #42
                          Originally posted by chris_j_hunter View Post
                          have now tried it here direct - Virtual API / Variable 0 toggled by a DRB button & connected direct to the Light ...

                          doesn't work ... do need to go through the GL object ... with the output set to To True ... which maybe is a clue as to why ... though it may also be that Scenes don't toggle (as it were) ... and that Scenes set levels, not on or off ...

                          having the GL object might be advantageous, too, because can incorporate other interlocks, for more context-sensitivity ...

                          OK .. I think I just needed play with it more actually

                          You can more simply just toggle a scene based on an API direct though right? .. rather that via a Virtual API object?

                          To be more specific than a random example ... one use-case I'm looking to control here is that in my office, I have 2 desks - 1 for each of myself and my wife. Each desk has external monitors that consume enough power that I don't leave them powered on full time, plus some aesthetic LED lighting on each desk. So, what I want is to vary the room activity based on "who" is at home during working-day hours.

                          If someone enters the office - I want each 'desk' to only power on only based on whether each individual is at home and clearly still obey the lights being controlled by room occupancy.

                          So with this, I suppose 1 GL Object Output could set each light / 'PC monitor' object to be active when that person is "home", and another GL Inactive when they leave the house, however, why wouldn't I just set the light / 'PC Monitor' active and inactive via the API that would otherwise have set the API Variable, direct, cutting out the middle man (the GL object)?


                          That said, I have just looked at what you said and (contrary to what I "think" you describe, maybe I'm mis-interpreting what you mean), I do appear to be able to control a light object using the Virtual API Variable state directly ... I've connected a test light object so that the "Turn On" connection = "Virtual API Object On True" and the the "Turn Off" connection = "Virtual API Object On False" ... with this, changing the state of the Virtual API object turns the light on/off depending the API value being True/False ..

                          Likewise I setup an 'Analogue (Real)' Virtual API variable, and I've connected the "Brightness (Dimmer Control)" connection of a Dimmer object to be "Virtual API Variable-Out Value" and with this, whatever value 0-100 I set the Virtual API variable to be, sets the brightness of the dimmer.


                          So .. I think this gives me scope to do what I need ... will certainly have more time to tinker over Xmas once tomorrow is out of the way


                          Originally posted by chris_j_hunter View Post

                          ===

                          btw ... just half an hour ago, I solved (thanks to an after-thought suggestion from my nephew) the POST problem ... the trick is to include - only for the Applescript / Shell situation (not Postman or Terminal, etc) a null data element ... ie: the problem was that the cURL was waiting on data that never arrived ...

                          ie: include -d'' (the '' being two single quotes) as follows :

                          do shell script "curl --location --request GET 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213' --header 'Authorization: Basic nnnnnnnnnnnnnnn'"

                          do shell script "curl --location --request POST 'http://nnn.nn.nn.nn:nnn/api/v1/Objects/2213?6=1' -d'' --header 'Authorization: Basic nnnnnnnnnnnnnnn'"
                          Ahh! Brilliant! Well done! ... these things are usually something simple enough, but without someone explicitly stating this is a mandatory "option" in a curl, ya wouldn't have known to find it without experimentation like this ..

                          Not that I've spent ages on it, but for the life of me I can't get curl working in PowerShell in Windows .. even for a basic GET I just get this in Powershell;


                          PS C:\Users\me> curl -X GET http://192.111.1.111:1111/api/v1/Objects/522 -H 'Authorization: Basic Y2xpZmZhcGk6Q2wxZmABbbse'

                          Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the "Authorization: Basic
                          Y2xpZmZhcGk6Q2wxZmABbbse" value of type "System.String" to type "System.Collections.IDictionary".
                          At line:1 char:61
                          + ... api/v1/Objects/522 -H 'Authorization: Basic Y2xpZmZhcGk6Q2wxZmABbbse'
                          + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          + CategoryInfo : InvalidArgument: (: ) [Invoke-WebRequest], ParameterBindingException
                          + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShel l.Commands.InvokeWebRequestCommand
                          www.clifford-wright.co.uk/blog

                          Comment

                          • chris_j_hunter
                            Automated Home Legend
                            • Dec 2007
                            • 1713

                            #43
                            no expert, but ...

                            my guess would be, after the GET ... you need enclose the http ... 522 in single quotes ...

                            also ... do please change your user-name & password, after posting what you posted !

                            Chris
                            Our self-build - going further with HA...

                            Comment

                            • cliffwright
                              Automated Home Guru
                              • Mar 2007
                              • 117

                              #44
                              Originally posted by chris_j_hunter View Post
                              no expert, but ...

                              my guess would be, after the GET ... you need enclose the http ... 522 in single quotes ...

                              I've tried all sorts of combinations of quotes etc .. nothing;

                              PS C:\Users\me> curl -X GET 'http://111.111.1.111:1111/api/v1/Objects/522' -H 'Authorization: Basic Y2xpZmZhcGk6Q2wxZmABbbse'
                              Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the "Authorization: Basic
                              Y2xpZmZhcGk6Q2wxZmABbbse" value of type "System.String" to type "System.Collections.IDictionary".
                              At line:1 char:63
                              + ... pi/v1/Objects/522' -H 'Authorization: Basic Y2xpZmZhcGk6Q2wxZmABbbse'
                              + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                              + CategoryInfo : InvalidArgument: (: ) [Invoke-WebRequest], ParameterBindingException
                              + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShel l.Commands.InvokeWebRequestCommand


                              Originally posted by chris_j_hunter View Post

                              also ... do please change your user-name & password, after posting what you posted !

                              Chris
                              That's not my actual username, nor IP, nor Bearer Token ... all very obfuscated

                              ~~~~~~~~~

                              Edit - I've just stumbled across a glint of genius by searching through a code base at work of all things ... if I try this;

                              curl 'http://111.111.1.111:1111/api/v1/Objects/522' -H @{Authorization = "Basic Y2xpZmZhcGk6Q2wxZmABbbse"}

                              It works ... so the answer was that I was enclosing the whole header K/V pair in the quotes, but only needed to enclose the Value part ..


                              StatusCode : 200
                              StatusDescription : OK
                              Content : {123, 13, 10, 32...}
                              RawContent : HTTP/1.1 200 OK
                              Connection: close
                              Content-Length: 3554
                              Content-Type: Content-Type: application/JSON

                              {
                              "CortexAPI":{
                              "CortexObject":{
                              "ControlObjectType":"TestLight",
                              "F...
                              Headers : {[Connection, close], [Content-Length, 3554], [Content-Type, Content-Type: application/JSON]}
                              RawContentLength : 3554


                              Hoorah!
                              Last edited by cliffwright; 18 December 2020, 10:22 AM. Reason: Answered my own question :)
                              www.clifford-wright.co.uk/blog

                              Comment

                              • chris_j_hunter
                                Automated Home Legend
                                • Dec 2007
                                • 1713

                                #45
                                >> You can more simply just toggle a scene based on an API direct though right? .. rather that via a Virtual API object?

                                >> looked at what you said and (contrary to what I "think" you describe, maybe I'm mis-interpreting what you mean), I do appear to be able to control a light object using the Virtual API Variable state directly ...

                                yes, you're right ... I tried it again, and this time it worked (*) ... though after turning the light on & off, I found I had to wait a few seconds before it could be turned on again ... which maybe is what confused me, last time ...

                                (*) both from a button press to toggle, and from an Applescript (!) ...


                                >> one use-case I'm looking to control here is that in my office ...

                                yes, why not do it without the GL ... assuming the desks are in a room separate from others, so presence is simply reliable ...


                                >> I setup an 'Analogue (Real)' Virtual API variable, and I've connected the "Brightness (Dimmer Control)" connection of a Dimmer object ...

                                ah, great - saves me the trouble of trying it out !


                                >>That's not my actual username, nor IP, nor Bearer Token ... all very obfuscated

                                ah good, sorry, but had to play safe !


                                good luck with the GPS link into HA ...wonder if that could also be done from iPhone ?


                                potentially very powerful, all this ... and so simple to do - now we've got to the bottom of it all ... interesting times !
                                Last edited by chris_j_hunter; 18 December 2020, 02:28 PM.
                                Our self-build - going further with HA...

                                Comment

                                Working...
                                X