Android Things – Electricity Monitoring App

For those who may not know, I live in beautiful sunny South Africa (see my tweets for lots of awesome pictures). A few years ago we battled with a lack of electricity. While “load-shedding” is not so common these days, we have numerous unplanned outages. We even have a few of apps that give out schedules when the electricity is scheduled to go off in your area (see here and here).

While these apps serve a purpose, they are not so good when we have unplanned outages.

Which often leaves me asking myself the following questions:

  • Do I have electricity at home right now?
  • If not, how long has the electricity been out for?
  • Is it okay to eat the contents of my freezer?

Introducing “Electricity Monitor”…

I decided to use a Raspberry Pi 3 running Android Things and Firebase Realtime Database to monitor the electricity in my house.

Mainly because Firebase has a VERY powerful tool for monitoring if a client is connected to your Realtime database or not. By leveraging the onDisconnect()  method on the Firebase Realtime database, the server can automatically change some data (or log a time) when a client disconnects from it.

Setup Requirements

In order to get the app running yourself, you need to:

  1. Checkout the repository here.
  2. Create a new Firebase Project here.
  3. Download the google-service.json file from the Firebase Console to both the app folder and the companion-app folder.
  4. Set the Realtime database rules to be read and write for everyone (Firebase Console -> Database -> Rules). (WARNING: This means there is NO security on our database – you should not have these rules in production)
  5. Deploy the “app” module to the Raspberry Pi or equivalent Android Things device (you need to make sure you have setup your Pi with the Android Things OS).
  6. Deploy the “companion-app” module to your phone.
  7. If you have electricity, you will see a house with lights on and the accumulated time you have had power for. If you don’t have electricity, the Raspberry Pi will lose its power source and trigger the onDisconnect()  callback on the Firebase server. This will then show up in our “companion-app” , it will display how long the electricity has been off for.

There you have it, a way to monitor your power at home using Android Things and Firebase!

Yes I know…

  • There are easier ways to monitor your power at home.
  • This is basically monitoring my Pi’s connection to the internet and not power, which in most cases will be accurate enough for me as I am hardly without internet. (I guess this could be rebranded as – “Do I have Internet at home?”)
  • Yes there is no security on the database right now. Luckily it is not controlling my power and its just a sample (Pull requests are welcome 🙂).
  • You might not understand the need for this app, which is okay, it is useful for me and hopefully fellow South Africans 😃

References

If you enjoy my blog posts, please consider buying me a cupcake!

Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

 

How to Stage Rollout Features using Firebase Remote Config (Android & iOS)

The Google Play Store has a great feature called “Staged Rollout“. It allows you to slowly release your app to a percentage of your user base. This feature is not available on the iTunes App Store. Using Firebase Remote Config, we can do much more than just stage rollout an entire app – we can stage rollout individual features within an iOS or Android app. 

By using the Google Play Store staged rollout feature, we can see how well a new version of our app is performing in the field without impacting our entire user base.

This is how it works: When uploading an APK on the Google Play Console, selecting the dropdown caret next to the giant Publish Now button allows publishing your app as a staged rollout. You can then choose a percentage of your user base that will receive the update. Random users will be chosen from this percentage and will have the update available to them for download.Staged Rollout in Google Play Store

The staged rollout feature on the Google Play Store has helped my team detect issues that weren’t found during the testing or development phase.

After using the staged rollout feature for a while, I assumed this was a standard feature and when asking iOS developers, it became clear to me that this isn’t available on iTunes.

When I was using Firebase Remote Config, I found something extremely handy. By leveraging the User in Random Percentile conditional, you can easily achieve a similar type of staged rollout in your iOS and Android apps without relying on the app stores to do it for you.

In this blog post, we will cover how to implement a staged rollout feature in your apps, focusing on the Android implementation (but iOS is very similar). If you are interested, check out my previous post on “A/B Testing your app using Firebase Remote Config“.[adwords_square]

Create feature flag and staged rollout conditional

  1. To set up your Firebase Project – follow the instructions here for Android and here for iOS.
  2. Navigate to Remote Config on the Firebase Dashboard. Create a conditional and use the “User in Random Percentile” to target 0 – 10% of your users. Name this conditional relative to the  parameter that you are going to define next.Staged Rollout percentage in Firebase Conditional
  3.  Create a new parameter called “feature_add_friends“, set the default value to false and the value for the above created conditional to true. Staged Rollout conditional

Use the feature flag

Within your app, you can now consume the parameter as you would any other variable from Firebase Remote Config and the server will decide if you should see the feature or not.

The part you should be interested in, is line 38 – 45, where we fetch the parameter and use it in the app. [adwords_square]

Rollout to more users

Once your feature has been released onto the app stores and users start to download it, you will be able to gauge how well it is performing. When you gain more confidence with your feature, you can slowly increase the percentage to more users.Increase staged rollout percentage.

When you are happy for all your users to use the new feature, you can simply remove the conditional altogether.

That is all you need to do in order to stage rollout a feature using Firebase Remote Config! Let me know what you think on Twitter – @riggaroo.


If you enjoyed this blog post, please consider buying me a cupcake!

[buy_cupcake]


 

A/B Test your App using Firebase Remote Config

Last week I was in Nairobi and Cape Town giving a talk on Remote Config and Test Lab in Firebase. I had such a great time and thought I should share some of the content I presented online.

What is A/B Testing?

A/B testing is the process of experimentally testing your UI on different audiences in order to determine the best (or most profitable) user experience.  Firebase Remote Config enables us to do A/B testing by allowing us to randomly segment our app audiences easily.

Example A/B Test

In this example, we are going to test out a different version of a checkout button that we have in our app.

A/B test we will run using Firebase Remote config.

For variant A of the experiment, we want to show a pink “Checkout” button. For variant B we want to show a blue “Cart” button. For the rest of our users, we will show the original “Finished” button.

Now for the fun part, setting up the experiment![adwords_square]

Set up Firebase Remote Config for A/B Testing

  1. Create a Firebase Project.
  2. Head to Remote Config section.
  3. Create a parameter – let’s call this parameter experiment_variant. Make the default value return no_experiment.Setting up parameter in Firebase Remote Config
  4. Click “Add value for Condition”. Then click “Define a new Condition”. Give it the name “Variant A”. We will select “User in Random Percentile” as the conditional. We will then choose the users from 0% – 10% that will receive variant A as their experiment. Click “Create Condition“.Adding a A/B Testing conditional to use with Firebase Remote Config
  5.  Now you will see that conditional appear for the experiment_variant parameter. Assign  variant_a to the value that should be returned for that variant.Conditional in Firebase Remote Config
  6. We will repeat the same for variant B, by creating a conditional for the users from 10% – 20%. This means that only 20% of the entire user base will be running the experiment and 80% will see no change in the standard UI. The percentage of the experiment is totally up to you. Variant B for Firebase Remote ConfigThen return variant_b for the parameter value:All variants in Firebase Remote Config
  7. Make sure to update and publish the changes. We have completed the server side setup of our experiment.

Setting up the A/B Test on Android Devices

Once you have configured the server, the hard part is done! The next section will cover how to get setup for Android but the code is really similar for iOS too – so don’t be deterred!

  1. In your android app, make sure you have the Firebase dependencies set up. Place the following in your top level build.gradle:
  2. Add the following in your app level build.gradle:
  3. Download google-services.json file from Firebase console and add it to your app/ folder.
  4. Create a remote config defaults file in the res/xml folder like the one below. This file will be used if the user has no internet connection when loading up the app for the first time.
  5. Initialise Firebase remote config. This is also where we set the defaults to the file we created in the previous step.
  6. Then fetch the remote config values. Firebase will automatically cache the values for the specified time that you provide. By default, it caches for 12 hours.
  7. In order to run our experiment, we should fetch the experiment_variant parameter from our remote config and use it in our app.

    In this example, we fetch the parameter and set a custom analytics user property with the variant that has been assigned to the current device. This will allow us to properly track how our A/B test is performing.  In the conditional, we are free to make the changes we want to the app. We can set the text to different things and change the colours depending on the variant.
  8. Now that we have the experiment running, we need to track when a user clicks on the “Checkout” button in order to determine which button variant a user is more likely to tap on. We then log the event to Firebase analytics which will include the user property that we set previously.

    It is worth noting that there are a bunch of default events and parameters that you can make use of with Firebase Analytics. [adwords_square]
  9. In order to determine the success of your A/B test, you need to analyse your data to decide which UI is the most successful. After logging into the console, we can see there were 24 counts of the “CheckoutClicked” event.firebase_analytics_ab_testingAfter applying the filter for the user property “Experiment = Variant A”, we can see that 19 of the 24 clicks were from variant A of the experiment (granted this was just me clicking around in my sample app – but you get the idea).

Variant A filters - Remote config

For larger data sets where the result of the experiment may not be obvious at first, you can export your events to BigQuery. This will allow you to make more complex deductions from your experiments.

For now at least, we know the clear winner (in this very large test 😬) is Variant A – the pink checkout button wins!

AB Testing variant A winner

There you have it, an easy way to experiment with your UI using Firebase Remote Config.

Sample code can be found here (It is not very complex as all the hard work is done by the Firebase APIs.) 😊

Happy AB Testing!


Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.